home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / c / datelib.exe / DIFFDATE.C < prev    next >
C/C++ Source or Header  |  1992-03-27  |  11KB  |  331 lines

  1. static char diffdate_prog[] = "@(#)long diffdate(char *d1,char *d2) - Datumsdifferenzen in Tagen";
  2. static char diffdate_ver[]  = "@(#)v1.11/kr ; 22.08.91";
  3. /* Autor        Klaus Rath
  4. **
  5. ** Deklaration  long diffdate(char *datum1, char *datum2);
  6. **
  7. ** Übergabe     Erwartet werden 2 Strings in folgenden optionalen Formaten:
  8. **              tt.mm.[[jj]jj]  -- deutsches Format
  9. **              mm/tt[/[jj]jj]  -- amerikanisches Format
  10. **              [jj]jjmmtt      -- DDB/4-Format
  11. **              wobei der Trenner '.' oder '/' bestimmt, ob deutsches oder
  12. **              amerikanisches Datumsformat berücksichtigt wird - bzw. Daten-
  13. **              bankformat, falls kein Trenner vorhanden ist. Da die beiden
  14. **              Datümer einzeln geprüft und konvertiert werden, dürfen unter-
  15. **              schiedliche Formate verwendet werden! Falls kein Jahrhundert
  16. **              mit übergeben wurde, nimmt die Funktion an, daß das aktuelle
  17. **              gemeint ist und holt es sich aus der Systemzeit!
  18. ** Rückgabe     Zurückgegeben wird die Differenz in Tagen als long-Wert.
  19. **              Da eine Differenz von 0 Tagen ja durchaus vorkommen kann, eignet
  20. **              sich die 0 nicht als Fehlerkennung. diffdate gibt für diesen
  21. **              Fall die Zahl 90909090 zurück, deren normales Zustandekommen
  22. **              ziemlich unwahrscheinlich sein dürfte.
  23. ** Anmerkung    Die Funktion verwendet die Funktionen schalt_jahr und anz_schaltj,
  24. **              die entsprechend mit eingebunden werden müssen.
  25. **              Der Bereich, in dem diffdate arbeiten kann, liegt
  26. **              zwischen dem 01.01.0000 und dem 31.12.9999 !!!
  27. ** Änderungen   1.00 ; 12.04.91
  28. **              Erste vollwertige Version
  29. **              1.10 ; 20.05.91
  30. **              Anpassung an die Formate tt.mm. und mm/tt, bei denen auch
  31. **              das Jahr durch das aktuelle belegt werden muß.
  32. **              Benutzung der Funktion anz_schaltjahre().
  33. **              1.11 ; 22.08.91
  34. **              Fehler beseitigt, der zur Differenz von einem Tag führte,
  35. **              wenn Ergebnis negativ war und das erste Datum in einem
  36. **              Schaltjahr liegt. Die Monatslängensetzung mlaen[2] muß dann
  37. **              wieder auf 28 zurückgesetzt werden!!
  38. */
  39.  
  40. #include <time.h>
  41. #include <string.h>
  42. #include <stdio.h>
  43. #include <sys\types.h>
  44. #ifdef __TURBOC__
  45. #include <stdlib.h>
  46. #endif
  47. #include "datum.h"
  48.  
  49. long diffdate(char *date1, char *date2)
  50. {
  51.     long   tages_summe1,tages_summe2;
  52.     long   ergebnis;
  53.     long   jahreszahl1,jahreszahl2;
  54.     char   t_s1[3],t_s2[3],m_s1[3],m_s2[3],j_s1[3],j_s2[3],jh_s1[3],jh_s2[3];
  55.     long   tage1,tage2,monate1,monate2,jahre1,jahre2,jh1,jh2;
  56.     int    laenge1,laenge2;
  57.     char   systemzeit_s[26];
  58.     time_t systemzeit;
  59.     long   zaehler;
  60.     long   mlaen[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
  61.     long   anz_sj;
  62.  
  63.     /* Längenüberprüfung :
  64.     */
  65.     laenge1 = strlen(date1);
  66.     if ( laenge1 == 6 || laenge1 == 8 || laenge1 == 10 || laenge1 == 5 )
  67.         ;
  68.     else
  69.         return((long)FEHLER);
  70.     laenge2 = strlen(date2);
  71.     if ( laenge2 == 6 || laenge2 == 8 || laenge2 == 10 || laenge2 == 5 )
  72.         ;
  73.     else
  74.         return((long)FEHLER);
  75.  
  76.     /* Jahrhundert und Jahr aus der Systemzeit ermitteln und vorbelegen :
  77.     */
  78.     time(&systemzeit);
  79.     strcpy(systemzeit_s,ctime(&systemzeit));
  80.     jh_s1[0] = systemzeit_s[20];
  81.     jh_s1[1] = systemzeit_s[21];
  82.     jh_s1[2] = '\0';
  83.     j_s1[0]  = systemzeit_s[22];
  84.     j_s1[1]  = systemzeit_s[23];
  85.     j_s1[2]  = '\0';
  86.     jh_s2[0] = systemzeit_s[20];
  87.     jh_s2[1] = systemzeit_s[21];
  88.     jh_s2[2] = '\0';
  89.     j_s2[0]  = systemzeit_s[22];
  90.     j_s2[1]  = systemzeit_s[23];
  91.     j_s2[2]  = '\0';
  92.  
  93.     /* Format überprüfen und umkopieren :
  94.     */
  95.     /* 1. Datum :
  96.     */
  97.     if ( date1[2] == '.' && date1[5] == '.' ) {  /* deutsches Format */
  98.         t_s1[0]      = date1[0];
  99.         t_s1[1]      = date1[1];
  100.         t_s1[2]      = '\0';
  101.         m_s1[0]      = date1[3];
  102.         m_s1[1]      = date1[4];
  103.         m_s1[2]      = '\0';
  104.         if ( laenge1 == 10 ) {
  105.             jh_s1[0] = date1[6];
  106.             jh_s1[1] = date1[7];
  107.             jh_s1[2] = '\0';
  108.             j_s1[0]  = date1[8];
  109.             j_s1[1]  = date1[9];
  110.             j_s1[2]  = '\0';
  111.         }
  112.         else if ( laenge1 == 8 ) {
  113.             j_s1[0]  = date1[6];
  114.             j_s1[1]  = date1[7];
  115.             j_s1[2]  = '\0';
  116.         }
  117.         else if ( laenge1 == 6 ) ;
  118.         else
  119.             return((long)FEHLER);
  120.     } /* ENDE: Deutsches Format */
  121.  
  122.     else if ( date1[2] == '/' &&
  123.               ( date1[5] == '/' || laenge1 == 5 ) ) {      /* amerik.Format */
  124.         t_s1[0]      = date1[3];
  125.         t_s1[1]      = date1[4];
  126.         t_s1[2]      = '\0';
  127.         m_s1[0]      = date1[0];
  128.         m_s1[1]      = date1[1];
  129.         m_s1[2]      = '\0';
  130.         if ( laenge1 == 10 ) {
  131.             jh_s1[0] = date1[6];
  132.             jh_s1[1] = date1[7];
  133.             jh_s1[2] = '\0';
  134.             j_s1[0]  = date1[8];
  135.             j_s1[1]  = date1[9];
  136.             j_s1[2]  = '\0';
  137.         }
  138.         else if ( laenge1 == 8 ) {
  139.             j_s1[0]  = date1[6];
  140.             j_s1[1]  = date1[7];
  141.             j_s1[2]  = '\0';
  142.         }
  143.         else if ( laenge1 == 5 ) ;
  144.         else
  145.             return((long)FEHLER);
  146.     } /* ENDE: Amerikanisches Format */
  147.  
  148.     else if ( atol(date1) != (long)NULL ) {       /* Datenbank-Format */
  149.         if ( laenge1 == 8 ) {
  150.             jh_s1[0]  = date1[0];
  151.             jh_s1[1]  = date1[1];
  152.             jh_s1[2]  = '\0';
  153.             j_s1[0]   = date1[2];
  154.             j_s1[1]   = date1[3];
  155.             j_s1[2]   = '\0';
  156.             t_s1[0]   = date1[6];
  157.             t_s1[1]   = date1[7];
  158.             t_s1[2]   = '\0';
  159.             m_s1[0]   = date1[4];
  160.             m_s1[1]   = date1[5];
  161.             m_s1[2]   = '\0';
  162.         }
  163.         else if ( laenge1 == 6 ) {
  164.             j_s1[0]   = date1[0];
  165.             j_s1[1]   = date1[1];
  166.             j_s1[2]   = '\0';
  167.             t_s1[0]   = date1[4];
  168.             t_s1[1]   = date1[5];
  169.             t_s1[2]   = '\0';
  170.             m_s1[0]   = date1[2];
  171.             m_s1[1]   = date1[3];
  172.             m_s1[2]   = '\0';
  173.         }
  174.         else
  175.             return((long)FEHLER);
  176.     } /* ENDE: Datenbankformat */
  177.     else
  178.         return((long)FEHLER);
  179.     /* ENDE:if(Formatprüfung und Kopierung für 1.Datum) */
  180.  
  181.     /* 2. Datum :
  182.     */
  183.     if ( date2[2] == '.' && date2[5] == '.' ) {  /* deutsches Format */
  184.         t_s2[0]      = date2[0];
  185.         t_s2[1]      = date2[1];
  186.         t_s2[2]      = '\0';
  187.         m_s2[0]      = date2[3];
  188.         m_s2[1]      = date2[4];
  189.         m_s2[2]      = '\0';
  190.         if ( laenge2 == 10 ) {
  191.             jh_s2[0] = date2[6];
  192.             jh_s2[1] = date2[7];
  193.             jh_s2[2] = '\0';
  194.             j_s2[0]  = date2[8];
  195.             j_s2[1]  = date2[9];
  196.             j_s2[2]  = '\0';
  197.         }
  198.         else if ( laenge2 == 8 ) {
  199.             j_s2[0]  = date2[6];
  200.             j_s2[1]  = date2[7];
  201.             j_s2[2]  = '\0';
  202.         }
  203.         else if ( laenge2 == 6 ) ;
  204.         else
  205.             return((long)FEHLER);
  206.     } /* ENDE: Deutsches Format */
  207.  
  208.     else if ( date2[2] == '/' &&
  209.               ( date2[5] == '/' || laenge2 == 5 ) )      { /* amerik.Format */
  210.         t_s2[0]      = date2[3];
  211.         t_s2[1]      = date2[4];
  212.         t_s2[2]      = '\0';
  213.         m_s2[0]      = date2[0];
  214.         m_s2[1]      = date2[1];
  215.         m_s2[2]      = '\0';
  216.         if ( laenge2 == 10 ) {
  217.             jh_s2[0] = date2[6];
  218.             jh_s2[1] = date2[7];
  219.             jh_s2[2] = '\0';
  220.             j_s2[0]  = date2[8];
  221.             j_s2[1]  = date2[9];
  222.             j_s2[2]  = '\0';
  223.         }
  224.         else if ( laenge2 == 8 ) {
  225.             j_s2[0]  = date2[6];
  226.             j_s2[1]  = date2[7];
  227.             j_s2[2]  = '\0';
  228.         }
  229.         else if ( laenge2 == 5 ) ;
  230.         else
  231.             return((long)FEHLER);
  232.     } /* ENDE: Amerikanisches Format */
  233.  
  234.     else if ( atol(date2) != (long)NULL ) {       /* Datenbank-Format */
  235.         if (